package com.hup.utils.io.batch;

import com.hup.utils.commons.TextUtil;

import java.util.ArrayList;

/**
 * @author hugan
 * @date 2020/2/22
 */
public interface BaseBatch<R> {

    /**
     * 要执行的命令
     */
    String cmd();

    /**
     * 命令的描述,用于异常时的消息描述;如:"查询运行中的服务"
     */
    String desc();

    /**
     * @param lstResp 执行命令后的返回内容
     */
    R parse(ArrayList<String> lstResp);

    default String getErrMsg(String resp) {
        return desc() + "错误:" + resp;
    }

    default String getErrMsg(ArrayList<String> lstResp) {
        StringBuilder sb = new StringBuilder();
        sb.append(desc()).append("错误\n");
        for (String line : lstResp) {
            if (!TextUtil.isBlank(line)) {
                sb.append(line).append('\n');
            }
        }
        sb.delete(sb.length() - 1, sb.length());
        return sb.toString();
    }

    /**
     * 直接等待 process.waitFor(),不读返回流,处理类似'start'命令的返回流一直阻塞的情况
     * <pre>
     *  注意,此方法对部分指令是要固定的!
     *      ."sc query state= all",不读取流而直接process.waitFor();会导致线程一直阻塞
     *          原因:此命令有大量输出数据,process会不断向流中写数据,
     *              流容量到达上限后,就会等用户读取后才继续写入数据!!!
     *              百度有文章,但网站不友好,所以不贴网址了
     *      ."start",本身数据流是没有返回数据的!(或者有个换行符?),
     *          如果先readStream,再process.waitFor();则也会因为流阻塞产生一直阻塞的情况
     *          .ps,即使加入了 {@link BatchUtil#MAX_WAIT_TIME},也要等待这么长时间才会返回结果,所以start是不应该读取流的
     *      .很坑
     * </pre>
     */
    default boolean skipReadStream() {
        return false;
    }

}
